package com.boot.ys.mybatisplus.script;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;

/**
 * 我给你一个文件夹路径，这个文件夹里面有很多子文件夹，子文件夹里面有很多的视频图片，
 * 我现在只要复制这些图片，复制到另外一个文件夹，也按输入文件夹的样子排列
 *
 * @author: 杨升
 * @date: 2024-08-10 21:05
 * @Version 1.0
 */

public class CopyImagesMaintainingStructure {

    // 支持的图像格式
    private static final String[] SUPPORTED_EXTENSIONS = {".jpg", ".jpeg", ".png", ".gif", ".bmp"};

    public static void main(String[] args) {
        // 输入文件夹
        String inputDirPath = "C:\\Users\\Acer\\Desktop\\压缩";
        // 输出文件夹
        String outputDirPath = "C:\\Users\\Acer\\Desktop\\输出";

        copyImagesMaintainingStructure(inputDirPath, outputDirPath);
    }

    public static void copyImagesMaintainingStructure(String inputDirPath, String outputDirPath) {
        File inputDir = new File(inputDirPath);
        File outputDir = new File(outputDirPath);

        if (!inputDir.isDirectory()) {
            System.out.println("输入路径不是一个目录。");
            return;
        }

        if (!outputDir.exists()) {
            outputDir.mkdirs(); // 创建输出目录
        }

        // 复制整个目录结构
        copyDirectory(inputDir, outputDir);
    }

    private static void copyDirectory(File inputDir, File outputDir) {
        File[] subDirs = inputDir.listFiles(File::isDirectory);
        if (subDirs == null) {
            System.out.println("在输入目录中没有找到子目录。");
            return;
        }

        for (File subDir : subDirs) {
            // 在输出目录中创建对应的子目录
            File outputSubDir = new File(outputDir, subDir.getName());
            if (!outputSubDir.exists()) {
                outputSubDir.mkdirs();
            }

            // 复制子目录中的图片
            copyImagesFromSubDirectory(subDir, outputSubDir);

            // 递归复制子目录
            copyDirectory(subDir, outputSubDir);
        }
    }

    private static void copyImagesFromSubDirectory(File inputSubDir, File outputSubDir) {
        File[] files = inputSubDir.listFiles();
        if (files == null) {
            System.out.println("无法读取目录中的文件。");
            return;
        }

        for (File file : files) {
            if (file.isFile() && isSupportedImageFormat(file.getName())) {
                try {
                    File outputFile = new File(outputSubDir, file.getName());
                    Files.copy(file.toPath(), outputFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
                    System.out.println("已复制 " + file.getName() + " 到 " + outputFile.getPath());
                } catch (IOException e) {
                    System.err.println("复制 " + file.getName() + " 失败: " + e.getMessage());
                }
            }
        }
    }

    // 检查文件扩展名是否是支持的图像格式
    private static boolean isSupportedImageFormat(String fileName) {
        for (String ext : SUPPORTED_EXTENSIONS) {
            if (fileName.toLowerCase().endsWith(ext)) {
                return true;
            }
        }
        return false;
    }
}
